import {defineStore} from "pinia" // 定义容器
import {logout} from '@/api'
import {getLoginUserPermissions} from '@/api/home/permission/menus'

export const useMenusStore = defineStore('permission', {
    /**
     * 存储全局状态，类似于vue2中的data里面的数据
     * 1.必须是箭头函数: 为了在服务器端渲染的时候避免交叉请求导致数据状态污染
     * 和 TS 类型推导
     */
    state: () => {
        return {
            menuList: [],//菜单信息(树结构)
            menuCodes: [],//权限码
            RouterList: [],//路由信息
            roleIds: [],//角色Id
            tabsList: [],
            tabsActive: '',//默认激活页,
            loginUser: {}
        }
    },
    /**
     * 用来封装计算属性 有缓存功能  类似于computed
     */
    getters: {},
    /**
     * 编辑业务逻辑  类似于methods
     */
    actions: {
        //处理路由格式：data-->后端传入的路由信息
        setRouterList(data) {
            data.forEach(item => {
                //格式化后端传入的路由信息
                this.RouterList.push({
                    path: item.path,//组件访问路径
                    name: item.name,
                    component: () => import(`@/views/${item.linkUrl}`),//组件的位置
                })
            })
        },
        getPermission() {
            //获取用户的权限信息
            return getLoginUserPermissions().then(res => {
                this.setRouterList(res.data.routers)//设置路由数据
                this.menuCodes = res.data.permissionsCode//设置权限码集合
                this.menuList = res.data.menus//设置菜单数据
                if (this.tabsList.length === 0) {
                    this.setTabs(this.menuList[0])
                }
                if (this.tabsActive === '') {
                    this.setActive(this.menuList[0].path)
                }
            })
        },
        logout() {
            /*注销登录*/
            return logout().then(res => {
                if (res.data.code === 200) {
                    window.sessionStorage.clear()//清除本地所有缓存
                    this.$reset()//清除状态管理所有数据
                    return true
                } else return false
            })
        },
        setTabs(node) {
            if (!this.tabsList.some(existingNode => existingNode.id === node.id)) {
                // 如果不存在，则添加
                this.tabsList.push(node);
            }
        },
        delTabs(node) {
            /*返回和node不相同的元素，就相当于把相同的元素删掉了*/
            this.tabsList = this.tabsList.filter(item => {
                return item.path !== node;
            })
        },
        setActive(value) {
            this.tabsActive = value
        },
        setLoginUser(user) {
            this.loginUser = user
        }
    },
    // 持久化设置
    persist: {
        enabled: true,	//开启
        storage: sessionStorage,	//修改存储位置
        key: 'permissions',	//设置存储的key,在这里是存在sessionStorage时的键
        paths: ['tabsList', 'tabsActive'],//指定要持久化的字段
    },
})

